home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 44
/
Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso
/
-in_the_mag-
/
basics
/
amos
/
othello.lha
/
Othello.AMOS
/
Othello.amosSourceCode
Wrap
AMOS Source Code
|
1994-08-11
|
6KB
|
247 lines
' *****************************
' * Othello by Dominic Ludlam *
' * Converted from the 64 *
' * in October 1993 *
' * Modified in October '94 *
' *****************************
Dim B(8,8),C(8),D(8,2),X(60),Y(60),N(60)
Global B(),C(),D(),X(),Y(),N(),CP,PS,CS,EN
OTHELLO
'
Procedure OTHELLO
STRT:
Screen Open 1,320,256,32,Lowres
Curs Off : Cls 0 : Paper 0
Centre "Othello"
Draw 128,8 To 182,8
Colour 5,$80
Colour 6,$80
Reserve Zone 64
SETUPZONES
_ASK:
Locate 0,13
Centre "Do you want first go (Y or N)" : Input X$
X$=Left$(X$,1) : CP=1 : If X$="n" Then CP=2
If(X$<>"y") and(X$<>"n") Then Goto _ASK
Curs Off
B(4,4)=1 : B(4,5)=2 : B(5,4)=2 : B(5,5)=1
For F=1 To 8 : Read A : D(F,1)=A : Read A : D(F,2)=A : Next
Data -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1
_DRAWTHEBOARD
MAIN_LOOP:
_UPDATETHEBOARD
If CS+PS=64 Then Gosub GAME_OVER
EG=0 : If CP=1 Then _PLAYERSMOVE : _UPDATETHEBOARD : If EG=1 Then Gosub GAME_OVER
If CS+PS=64 Then Gosub GAME_OVER
If CP=2 Then _COMPUTERSMOVE
Goto MAIN_LOOP
GAME_OVER:
Locate 0,29
If CS>PS Then Print "That was Easy!!!"
If CS=PS Then Print "We drew, I need some practice!"
If CS<PS Then Print "You were lucky!"
_ASK4:
Locate 0,30 : Print "Do you want another game? (Y/N)"; : Input X$
X$=Upper$(X$)
If X$="Y"
For X=1 To 8
For Y=1 To 8
B(X,Y)=0
Next
Next
Goto STRT
End If
If(X$<>"Y") and(X$<>"N") Then Goto _ASK4
End
End Proc
Procedure _UPDATETHEBOARD
CS=0
PS=0
For F=1 To 8
For G=1 To 8
X=((F-1)*26)+12
Y=((G-1)*26)+12
If(B(F,G)=1) and Point(X,Y)<>2 Then Ink 2 : Paint X,Y,1
If(B(F,G)=2) and Point(X,Y)<>1 Then Ink 0 : Paint X,Y,1
If B(F,G)=1 Then PS=PS+1
If B(F,G)=2 Then CS=CS+1
Next G
Next F
Locate 27,1 : Print "1" : Locate 27,4 : Print "2" : Locate 27,8 : Print "3"
Locate 27,11 : Print "4" : Locate 27,14 : Print "5" : Locate 27,18 : Print "6"
Locate 27,21 : Print "7" : Locate 27,24 : Print "8"
Locate 0,27 : Print " 1 2 3 4 5 6 7 8"
Locate 33,1 : Print "Othello"
Locate 34,3 : Print "Player"
Locate 34,4 : Print " " : Locate 34,4 : Print PS
Locate 32,6 : Print "Computer"
Locate 34,7 : Print " " : Locate 34,7 : Print CS
End Proc
Procedure _DRAWTHEBOARD
Cls 0
Ink 5
Bar 0,0 To 208,208
Ink 2
For X=0 To 208 Step 26
Draw X,0 To X,208
Next X
For Y=0 To 208 Step 26
Draw 0,Y To 208,Y
Next
Ink 6
For Z=13 To 208 Step 26
For Y=13 To 208 Step 26
Circle Z,Y,10
Next
Next
End Proc
Procedure _PLAYERSMOVE
_ASK2:
Repeat
If Mouse Click=2 Then CP=2 : Pop Proc
If Mouse Click=3 Then EG=1 : Pop Proc
Until Mouse Zone>0 and Mouse Click=1
X=(Mouse Zone/8)+1
Y=(Mouse Zone mod 8)
If Y=0 Then Y=8
If Y=8 Then X=Mouse Zone/8
If(X<1 or X>8) or(Y<1 or Y>8) Then Goto _ASK2
If B(X,Y)>0 Then Goto BAD_MOVE
NF=0
For F=1 To 8
CF=0
If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
If Y+D(F,2)=9 or Y+D(F,2)=0 Then Goto SKIPPED
If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
If B((X+D(F,1)),(Y+D(F,2)))=2 Then CF=1 : NF=1
SKIPPED:
C(F)=0 : If CF=1 Then C(F)=F
Next F
If NF<>1 Then Goto BAD_MOVE
RF=0
For Q=1 To 8
If C(Q)=0 Then Goto SKIPPED2
XP=X : YP=Y
O:
Add XP,D(Q,1)
Add YP,D(Q,2)
If(XP=0 or XP=9) or(YP=0 or YP=9) Then C(Q)=0 : Goto SKIPPED2
If B(XP,YP)=2 Then Goto O
If B(XP,YP)=1 Then RF=1 : Goto SKIPPED2
If B(XP,YP)=0 Then C(Q)=0
SKIPPED2:
Next
If RF<>1 Then Goto BAD_MOVE
For Q=1 To 8
If C(Q)=0 Then Goto _NEXT
XP=X+D(Q,1) : YP=Y+D(Q,2)
TEST:
If B(XP,YP)=1 Then Goto _NEXT
B(XP,YP)=1
XP=XP+D(Q,1)
YP=YP+D(Q,2)
Goto TEST
_NEXT:
Next Q
B(X,Y)=1
CP=2 : Pop Proc
BAD_MOVE:
If B(X,Y)>0 Then Locate 0,29 : Cline : Print "You cannot move onto an occupied square" : Wait 100 : Goto _ASK2
If NF<>1 Then Locate 0,29 : Cline : Print "Your move isn't next to one of my pieces" : Wait 100 : Goto _ASK2
If RF<>1 Then Locate 0,29 : Cline : Print "Your move doesn't flank a row" : Wait 100 : Goto _ASK2
Goto _ASK2
End Proc
Procedure _COMPUTERSMOVE
Locate 0,29 : Print "Thinking..."
NF=1
MX=0
For X=1 To 8
For Y=1 To 8
If B(X,Y)<>0 Then Goto _NEXT2
For F=1 To 8
XP=X
YP=Y
DX=D(F,1)
DY=D(F,2)
RF=0
P:
XP=XP+DY : YP=YP+DX : If(XP=0 or XP=9) or(YP=0 or YP=9) Then Goto _NEXT3
If B(XP,YP)=1 Then RF=1 : Goto P
If B(XP,YP)=2 and RF=1 Then N(NF)=F : X(NF)=X : Y(NF)=Y : NF=NF+1 : F=9
_NEXT3:
Next F
_NEXT2:
Next Y
Next X
NF=NF-1
If NF=0 Then Goto NO_MOVE
For F=1 To NF
X=X(F)
Y=Y(F)
DX=D(N(F),1)
DY=D(N(F),2)
CF=0
_LOOP:
X=X+DY : Y=Y+DX : If B(X,Y)=1 Then CF=CF+1 : Goto _LOOP
If CF>MX Then MX=CF : MF=F
Next
For F=1 To 8
X=X(MF)
Y=Y(MF)
DX=D(F,1)
DY=D(F,2)
_LOOP2:
X=X+DY : Y=Y+DX
If(X=0 or X=9) or(Y=0 or Y=9) Then Goto _NEXT4
If B(X,Y)=1 Then Goto _LOOP2
If B(X,Y)=2 Then Goto SKIPPED3
If B(X,Y)=0 Then Goto _NEXT4
SKIPPED3:
X=X(MF)
Y=Y(MF)
_LOOP3:
B(X,Y)=2
X=X+DY
Y=Y+DX
If B(X,Y)=2 Then Goto _NEXT4
Goto _LOOP3
_NEXT4:
Next
Locate 0,29 : Cline
CP=1 : Pop Proc
NO_MOVE:
Locate 0,29 : Print "I can't make a move" : Wait 100 : CP=1 : Pop Proc
End Proc
Procedure SETUPZONES
Z=1
For X=1 To 208 Step 26
For Y=1 To 208 Step 26
Set Zone Z,X,Y To X+25,Y+25
Inc Z
Next Y
Next X
End Proc